import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

/// 强大的自定义输入框，支持丰富配置，含详细注释
class CustomTextField extends StatefulWidget {
  /// 提示文本
  final String? hintText;

  /// 输入框控制器（可选）
  final TextEditingController? controller;

  /// 输入类型（如文本、数字、电话等）
  final TextInputType keyboardType;

  /// 是否为密码框（隐藏内容）
  final bool obscureText;

  /// 是否显示密码切换图标（用于密码框）
  final bool showTogglePassword;

  /// 前缀图标
  final IconData? prefixIcon;

  /// 后缀图标
  final IconData? suffixIcon;

  /// 前缀文字（图标右侧）
  final String? prefixText;

  /// 前缀文字样式
  final TextStyle? prefixTextStyle;

  /// 后缀文字（图标左侧）
  final String? suffixText;

  /// 后缀文字样式
  final TextStyle? suffixTextStyle;

  /// 是否只读
  final bool readOnly;

  /// 是否可用（disabled 状态）
  final bool enabled;

  /// 错误提示文本
  final String? errorText;

  /// 最大长度限制
  final int? maxLength;

  /// 最大行数（默认单行）
  final int maxLines;

  /// 是否自动聚焦
  final bool autoFocus;

  /// 输入变化回调
  final ValueChanged<String>? onChanged;

  /// 提交回调（键盘点击完成）
  final ValueChanged<String>? onSubmitted;

  /// 输入校验器（配合 Form）
  final String? Function(String?)? validator;

  /// 填充颜色
  final Color? fillColor;

  /// 是否填充背景色
  final bool filled;

  /// 边框颜色
  final Color? borderColor;

  /// 聚焦状态下边框颜色
  final Color? focusedBorderColor;

  /// 圆角大小
  final double borderRadius;

  /// 字体大小
  final double fontSize;

  /// 字体颜色
  final Color? fontColor;

  /// 光标颜色
  final Color? cursorColor;

  /// 内容内边距
  final EdgeInsetsGeometry contentPadding;

  /// 焦点控制（配合自动跳转等）
  final FocusNode? focusNode;

  /// 输入格式限制器
  final List<TextInputFormatter>? inputFormatters;

  /// 是否显示清空按钮
  final bool showClearButton;

  /// 小数位限制（如限制2位小数）
  final int? decimalRange;

  /// 是否启用自动跳转到下一个焦点
  final bool autoFocusNext;

  /// 下一个焦点控制器
  final FocusNode? nextFocusNode;

  /// 可选宽度
  final double? width;

  /// 可选高度
  final double? height;

  const CustomTextField({
    super.key,
    this.hintText,
    this.controller,
    this.keyboardType = TextInputType.text,
    this.obscureText = false,
    this.showTogglePassword = false,
    this.prefixIcon,
    this.suffixIcon,
    this.prefixText,
    this.prefixTextStyle,
    this.suffixText,
    this.suffixTextStyle,
    this.readOnly = false,
    this.enabled = true,
    this.errorText,
    this.maxLength,
    this.maxLines = 1,
    this.autoFocus = false,
    this.onChanged,
    this.onSubmitted,
    this.validator,
    this.fillColor,
    this.filled = false,
    this.borderColor,
    this.focusedBorderColor,
    this.borderRadius = 8.0,
    this.fontSize = 16.0,
    this.fontColor,
    this.cursorColor,
    this.contentPadding = const EdgeInsets.symmetric(
      horizontal: 12,
      vertical: 14,
    ),
    this.focusNode,
    this.inputFormatters,
    this.showClearButton = false,
    this.decimalRange,
    this.autoFocusNext = false,
    this.nextFocusNode,
    this.width,
    this.height,
  });

  @override
  State<CustomTextField> createState() => _CustomTextFieldState();
}

class _CustomTextFieldState extends State<CustomTextField> {
  late bool _obscureText;

  @override
  void initState() {
    super.initState();
    // 初始化是否隐藏密码
    _obscureText = widget.obscureText;
  }

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: widget.width,
      height: widget.height,
      child: TextFormField(
        controller: widget.controller,
        // 控制器
        focusNode: widget.focusNode,
        // 焦点控制器
        keyboardType: widget.keyboardType,
        // 输入类型
        obscureText: _obscureText,
        // 是否隐藏输入内容
        readOnly: widget.readOnly,
        // 是否只读
        enabled: widget.enabled,
        // 是否可用
        maxLength: widget.maxLength,
        // 最大长度
        maxLines: widget.maxLines,
        // 最大行数
        autofocus: widget.autoFocus,
        // 自动聚焦
        inputFormatters: widget.inputFormatters,
        // 输入格式控制器
        style: TextStyle(
          fontSize: widget.fontSize, // 字体大小
          color: widget.fontColor, // 字体颜色
        ),
        cursorColor: widget.cursorColor,
        // 光标颜色
        decoration: InputDecoration(
          counterText: '',
          hintText: widget.hintText,
          // 提示文字
          errorText: widget.errorText,
          // 错误信息
          prefixIcon:
              widget.prefixIcon != null
                  ? Icon(widget.prefixIcon) // 前缀图标
                  : null,
          suffixIcon:
              widget.showTogglePassword || widget.showClearButton
                  ? Row(
                    mainAxisSize: MainAxisSize.min,
                    children: [
                      if (widget.showClearButton &&
                          widget.controller != null &&
                          widget.controller!.text.isNotEmpty)
                        IconButton(
                          icon: const Icon(Icons.clear),
                          onPressed: () => widget.controller!.clear(),
                        ),
                      if (widget.showTogglePassword)
                        IconButton(
                          icon: Icon(
                            _obscureText
                                ? Icons.visibility
                                : Icons.visibility_off,
                          ),
                          onPressed:
                              () =>
                                  setState(() => _obscureText = !_obscureText),
                        ),
                    ],
                  )
                  : (widget.suffixIcon != null
                      ? Icon(widget.suffixIcon) // 后缀图标
                      : null),
          prefixText: widget.prefixText,
          // 前缀文字
          prefixStyle: widget.prefixTextStyle,
          // 前缀文字样式
          suffixText: widget.suffixText,
          // 后缀文字
          suffixStyle: widget.suffixTextStyle,
          // 后缀文字样式
          filled: widget.filled,
          // 是否填充背景色
          fillColor: widget.fillColor,
          // 背景色
          contentPadding: widget.contentPadding,
          // 内边距
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(widget.borderRadius), // 圆角
            borderSide: BorderSide(
              color: widget.borderColor ?? Colors.grey,
            ), // 边框颜色
          ),
          focusedBorder: OutlineInputBorder(
            borderRadius: BorderRadius.circular(widget.borderRadius),
            borderSide: BorderSide(
              color:
                  widget.focusedBorderColor ?? Theme.of(context).primaryColor,
            ),
          ),
        ),
        onChanged: (value) {
          widget.onChanged?.call(value); // 实时变化回调
          if (widget.autoFocusNext &&
              value.isNotEmpty &&
              widget.nextFocusNode != null) {
            FocusScope.of(context).requestFocus(widget.nextFocusNode); // 自动跳转焦点
          }
        },
        onFieldSubmitted: widget.onSubmitted,
        // 提交回调
        validator: widget.validator, // 表单验证器
      ),
    );
  }
}
